/* -----------------------------------------------------------------------
 *   Copyright (C) 2008 by Denjs
 *   dplsoft@pisem.net
 *   http://qdroid.berlios.de
 * -----------------------------------------------------------------------
 *   This program is free software licensed under GNU GPL License v.2 ; see main.cpp fo details
 *   Эта программа является свободным программным обеспечением; распространяемым под
 *   лицензией GNU General Public License v.2 (УНИВЕРСАЛЬНАЯ ОБЩЕСТВЕННАЯ ЛИЦЕНЗИЯ GNU версия 2.0) 
 * ----------------------------------------------------------------------- */
#ifndef T_TREEWIDGET_H
#define T_TREEWIDGET_H

#include <QtGui/QWidget>
#include "ui_t_TreeWidget.h"
#include "t_TreeWidgetItem.h"
	//non visual class but now inherided from QObject to be used in QtScript

class t_FileList;
/*

ok: реализовать слоты для отслеживания событий ячеек,
ok, это возможно: реализовать модификацию ячеек в таблице при кликах.
ok, это возможно: сделать возможность выбирать отдельную ячейку а не строку полностью

OK: перебор отредактированных элементов
OK: работа с заголовками
TODO: программное раскрытие/закрытие дерева
TODO: получение информации о дереве - родителе и подчиненных элементах
TODO: определить опреацию сравнения для t_TreeWidgetItem
		- для того, что бы 2 контейнера ссылающиеся
		на один QTreeWidgetItem при сравнении были равны!

TODO: удаление/добавление элементов виджетов в формиррованном дереве
TODO: обновление QTreeWidget в сформированном дереве

*/

class t_TreeWidget : public QWidget
{
    Q_OBJECT

public:
    t_TreeWidget(QWidget *parent = 0);
    ~t_TreeWidget();

	//это (ниже) нужно что бы можно было засунуть t_FileList в контейнер QList
	// возможно так-же связано с работой QtScript движка - см функции после определения класса
	// спец. настройки для QtScript (v 2008.11.25)
	// Шаг 1 из 8
	t_TreeWidget(const t_TreeWidget &other);
	//это (ниже) нужно что бы можно было засунуть t_TreeWidgetItem в контейнер QList
	// возможно так-же связано с работой QtScript движка - см функции после определения класса
	// спец. настройки для QtScript (v 2008.11.25)
	// Шаг 2 из 8
	t_TreeWidget& operator=(const t_TreeWidget &other);

    QTreeWidget *CoreQTreeWidget;

//    Q_INVOKABLE void setParent(QWidget *parent): setParent(parent){};

	Q_PROPERTY(int TopLevelItemCount READ get_top_level_item_count );

	QStringList HeaderLabels;

public slots:
	QString std_in(QString Message); //(*virtual*) needs to be redefined to make real class
	t_TreeWidget* copy();//(*virtual*)костыли в рузультуате того что регистрируем ссылку а не сам тип для движка

/* события */
	void ItemClicked_rcv(QTreeWidgetItem *item, int column);
	void ItemDoubleClicked_rcv(QTreeWidgetItem *item, int column);
	void ItemActivated_rcv(QTreeWidgetItem *item, int column);
	void ItemSelectionChanged_rcv();
	void CurrentItemChanged_rcv(QTreeWidgetItem *current, QTreeWidgetItem *previous);
	void ItemPressed_rcv(QTreeWidgetItem *item, int column);

/* методы */
	//QtScript usable functions (QDroid adapted)
	void EditItem(t_TreeWidgetItem *item, int column);
	//some redeclarations for coll QtScripting
	void set_parent(QWidget *parent);//установить родительский виджет.

	int get_top_level_item_count();
	t_TreeWidgetItem* get_top_level_item(int _Index);
	int expandItem(t_TreeWidgetItem *item);

/* работа со списком элементов */
	//t_FileList *create_file_list();//создать объект t_FileList из текущего дерева
	int index_items();//составляет список для работы с элементами по порядковому номеру//2008.12.03
	int indexed_items_count();//вернуть размер списка индексированных элементов//2008.12.03
	t_TreeWidgetItem* indexed_item(int _Position);//составляет список для работы с элементами по порядковому номеру//2008.12.03
	int index_where_rowvalue_is(int _Row,QString _Value);//получить индекс где заданное поле (колонка) равна значению


/*!*/int enable_edittriggers(int _Mode);//0-не редактировать по 2-му клику 1- редактировать по 2-му клику
	void set_colomn_header_label(int _Column,QString _Label);
	void set_colomn_width(int _Column,int _Width);

	void set_header_labels(QString PropertyOrder);
	int set_column_background(int _Column,QString _RRGGBBColorString);//
	int sortByColumn(int _Column, int _Order=0);//2009.09.02 added 

/* различное */
	QPushButton* get_button(QString PushButonName);//вернуть ссылку на кнопку с заданным именем.
	int hide_all_buttons();

	int set_selection_behavior(int _mode);//поведение выбора см enum QAbstractItemView::SelectionBehavior
	int set_size(int _width,int _height);//установить размер окна
	int set_pos(int _x,int _y);

signals:
	void item_clicked(t_TreeWidgetItem *item, int column);
	void item_double_clicked(t_TreeWidgetItem *item, int column);
	void item_activated(t_TreeWidgetItem *item, int column);
	void item_selection_changed();
	void current_item_changed(t_TreeWidgetItem *current, t_TreeWidgetItem *previous);


/*
void itemPressed(QTreeWidgetItem *item, int column);
void itemEntered(QTreeWidgetItem *item, int column);
void itemChanged(QTreeWidgetItem *item, int column);
void itemExpanded(QTreeWidgetItem *item);
void itemCollapsed(QTreeWidgetItem *item);
void currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
*/


private:
    Ui::t_TreeWidgetClass ui;
    QList<QTreeWidgetItem*> scan_item_tree(QTreeWidgetItem* RootItem);
    QList<QTreeWidgetItem*> IndexListForTreeWidgetItem;//список "итемов" для обращения по порядколвому номеру.//2008.12.03

};

//=================================================================
//нужно чтобы можно было передавать эти элементы как параметры в функции внутри QtScript
// спец. настройки для QtScript (v 2008.11.25)
// Шаг 3 из 8
Q_DECLARE_METATYPE(t_TreeWidget*);

// спец. настройки для QtScript (v 2008.11.25)
// Шаг 4 из 8
static QScriptValue qdroid_t_TreeWidget_toScriptValue(QScriptEngine *engine, t_TreeWidget* const &in)
{ return engine->newQObject(in); }

// спец. настройки для QtScript (v 2008.11.25)
// Шаг 5 из 8
static void qdroid_t_TreeWidget_fromScriptValue(const QScriptValue &object, t_TreeWidget* &out)
{ out = qobject_cast<t_TreeWidget*>(object.toQObject()); }

// спец. настройки для QtScript (v 2008.11.25)
// Шаг 6 из 8
//конструктор для последующего его определения как new в скрипте
static QScriptValue qdroid_t_TreeWidget_constructor(QScriptContext *QSContext, QScriptEngine *QSEngine)
	{
		//t_BaseBot BaseBot;
		QScriptValue QtSObject;
		QtSObject=QSEngine->newQObject(new t_TreeWidget()); //
		//qsBaseBot=QSEngine->toScriptValue(BaseBot);
		return QtSObject;
	}

// спец. настройки для QtScript (v 2008.11.25)
// Шаг 7 из 8
// - это qScriptRegisterMetaType регистрация но это нужно сделать в головном классе
// например в глобальной функции "define__qdroid_qtscript_functions()"
//// t_TreeWidget TYPE defenition
//	qScriptRegisterMetaType(_QSEngine, qdroid_t_TreeWidget_toScriptValue, qdroid_t_TreeWidget_fromScriptValue);

// спец. настройки для QtScript (v 2008.11.25)
// Шаг 8 из 8
//- определение конструктора в контексте скрипта
//// t_TreeWidget NEW constructor defenition
//	QScriptValue t_TreeWidget_constr_func = _QSEngine->newFunction(qdroid_t_TreeWidget_constructor);
//	_QSEngine->globalObject().setProperty("t_TreeWidget", t_TreeWidget_constr_func);


//=================================================================


Q_DECLARE_METATYPE(QPushButton*);

// спец. настройки для QtScript (v 2008.11.25)
// Шаг 4 из 8
static QScriptValue qdroid_QPushButton_toScriptValue(QScriptEngine *engine, QPushButton* const &in)
{ return engine->newQObject(in); }

// спец. настройки для QtScript (v 2008.11.25)
// Шаг 5 из 8
static void qdroid_QPushButton_fromScriptValue(const QScriptValue &object, QPushButton* &out)
{ out = qobject_cast<QPushButton*>(object.toQObject()); }

// спец. настройки для QtScript (v 2008.11.25)
// Шаг 6 из 8
//конструктор для последующего его определения как new в скрипте
static QScriptValue qdroid_QPushButton_constructor(QScriptContext *QSContext, QScriptEngine *QSEngine)
	{
		//t_BaseBot BaseBot;
		QScriptValue QtSObject;
		QtSObject=QSEngine->newQObject(new QPushButton()); //
		//qsBaseBot=QSEngine->toScriptValue(BaseBot);
		return QtSObject;
	}

//	qScriptRegisterMetaType(_QSEngine, qdroid_QPushButton_toScriptValue, qdroid_QPushButton_fromScriptValue);

//	QScriptValue QPushButton_constr_func = _QSEngine->newFunction(qdroid_QPushButton_constructor);
//	_QSEngine->globalObject().setProperty("QPushButton", QPushButton_constr_func);


//=================================================================

#endif // T_TREEWIDGET_H
